﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace C_初级教程
{
    public class 事件
    {
        //委托和事件本质上是一样的，只不过一个是主内一个主外


        //定义事件
        //事件的本质是委托的实例
        //事件是特殊的委托
        public event Action event1;


        public void test()
        {
            //订阅方法
            event1 += () =>
            {
                string a = "触发事件1";
            };
            event1 += () =>
            {
                string a = "触发事件2";
            };
            //如果要取消订阅，方法一定不能是匿名方法

            //触发事件
            event1();
            event1.Invoke();
        }
    }


    // 事件的典型使用场景：(事件驱动编程：  事件+ 委托)

    public delegate void EventHander(object sender, EventArgs e);

    public class Button
    {
        public event EventHander Click; // 声明一个Click事件

        public void ClickButton()
        {
            Click?.Invoke(this,EventArgs.Empty);
        }
    }

    public class Form
    {
        public Button Button { get; set; }

        public Form(Button button)
        {
            Button = button;
            button.Click += Button_Click_Handler; // 订阅事件
        }

        public void Button_Click_Handler(object sender, EventArgs e)
        {
            // 这进行是事件处理逻辑
        }

        public void TriggerClick()
        {
            Button.ClickButton();  // 触发事件
        }
    }
    
   
}
